home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / akcl / kcl.lha / c / filesystem.c < prev    next >
C/C++ Source or Header  |  1987-06-04  |  14KB  |  700 lines

  1. /*
  2. (C) Copyright Taiichi Yuasa and Masami Hagiya, 1984.  All rights reserved.
  3. */
  4.  
  5. /*
  6.     filesystem.c
  7.     DG-SPECIFIC
  8. */
  9.  
  10. #include "packets:filestatus.h"
  11. #include "include.h"
  12.  
  13. #define $FLNK    00  /* LINK */
  14. #define $FIPC    036  /* IPC PORT ENTRY */
  15. #define $FDIR    012  /* DISK DIRECTORY */
  16. #define $FLDU    013  /* LD ROOT DIRECTORY */
  17. #define $FCPD    014  /* CONTROL POINT DIRECTORY */
  18. #define $FDKU    024  /* DISK UNIT */
  19. #define $FMCU    025  /* MULTIPROCESSOR COMMUNICATIONS UNIT */
  20. #define $FMTU    026  /* MAG TAPE UNIT */
  21. #define $FLPU    027  /* DATA CHANNEL LINE PRINTER */
  22. #define $FLPD    030  /* DATA CHANNEL LP2 UNIT */
  23.  
  24. #define EREOF    030  /* END OF FILE */
  25. #define ERFDE    025  /* FILE DOES NOT EXIST */
  26.  
  27. #define $MXPL    0400  /* MAX PATHNAME LENGTH (BYTES) */
  28.  
  29. #define  $DELETE      01     /* DELETE FILE */
  30. #define  $RENAME      02     /* RENAME A FILE */
  31. #define  $GUNM       072     /* GET A PROCESS'S USER NAME */
  32. #define  $DIR        075     /* CHANGE WORKING DIRECTORY */
  33. #define  $FSTAT      077     /* GET FILE STATUS */
  34. #define  $GNAME     0111     /* GET FULL PATHNAME */
  35. #define  $GACL      0115     /* GET A FILE'S ACL */
  36. #define  $GNFN      0131     /* GET NEXT FILE NAME FROM DIR */
  37.  
  38. #define MAXNAME 256
  39.  
  40. union fstat {
  41.     P_FSTAT other;
  42.     P_FSTAT_DIR dir;
  43.     P_FSTAT_IPC ipc;
  44.     P_FSTAT_UNIT unit;
  45.     };
  46.  
  47. int    debug;
  48.  
  49. rename_file(filen, newname)
  50. char *filen, *newname;
  51. {
  52.     int ac0, ac1, ac2, ier;
  53.  
  54.     ac0 = filen;
  55.     ac1 = newname;
  56.     if (ier = sys($RENAME, &ac0, &ac1, &ac2))
  57.         sys_emes(ier);
  58. }
  59.  
  60. delete_file(filen)
  61. char *filen;
  62. {
  63.     int ac0, ac1, ac2, ier;
  64.  
  65.     ac0 = filen;
  66.     if (ier = sys($DELETE, &ac0, &ac1, &ac2))
  67.         sys_emes(ier);
  68. }
  69.  
  70. probe_file(filen, truename, bufflen)
  71. char *filen, *truename;
  72. int bufflen;
  73. {
  74.     int ac0, ac1, ac2, ier;
  75.  
  76.     ac0 = filen;
  77.     ac1 = truename;
  78.     ac2 = bufflen;
  79.     if (ier = sys($GNAME, &ac0, &ac1, &ac2))
  80.         if (ier == ERFDE)
  81.             return(FALSE);
  82.         else
  83.             sys_emes(ier);
  84.     return(TRUE);
  85. }
  86.  
  87. int
  88. dir_where_file(filen, dirn)
  89. char *filen, *dirn;
  90. {
  91.     int    ac0, ac1, ac2, ier;
  92.     int    i, j, d, d1;
  93.     char    slist[$MXPL+2];
  94.     char    pathn[MAXNAME];
  95.     char    dummy[MAXNAME];
  96.  
  97.     slist[0] = '=';
  98.     slist[1] = '\0';
  99.  
  100.     ac1 = &slist[2];
  101.     ac2 = $MXPL + 2;
  102.     if (ier = sys($GLIST, &ac0, &ac1, &ac2))
  103.         sys_emes(ier);
  104.  
  105.     d = d1 = 0;
  106.     for (d = d1 = 0; ; d1 = d) {
  107.         for (i = 0; (pathn[i] = slist[d]) != '\0'; i++, d++)
  108.             ;
  109.         if (i == 0) return(FALSE);
  110.         d++;
  111.         for (j = 0; (pathn[i] = filen[j]) != '\0'; i++, j++)
  112.             ;
  113.         if (probe_file(pathn, dummy, MAXNAME)) break;
  114.     }
  115.     probe_file(&slist[d1], dirn, MAXNAME);
  116.     return(TRUE);
  117. }
  118.  
  119. FILE *
  120. backup_fopen(filen, open_opt)
  121. char *filen, *open_opt;
  122. {
  123.     int    ac0, ac1, ac2, ier;
  124.     int    i, j;
  125.     object    p, d, f;
  126.     FILE    *fd;
  127.     char    *c;
  128.     char    filename[MAXNAME], dirn[MAXNAME];
  129.     char    buname[MAXNAME];
  130.     vs_mark;
  131.  
  132.     p = make_simple_string(filen);
  133.     vs_push(p);
  134.     p = coerce_to_pathname(p);
  135.     vs_pop;
  136.     vs_push(p);
  137.     f = make_pathname(Cnil, Cnil, Cnil,
  138.               p->pn.pn_name,
  139.               p->pn.pn_type,
  140.               p->pn.pn_version);
  141.     vs_push(f);
  142.     f = coerce_to_namestring(f);
  143.     vs_pop;
  144.     vs_push(f);
  145.  
  146.     if (f == Cnil)
  147.         FEerror("Zero length filename was specified.", 0);
  148.  
  149.     c = f->st.st_self;
  150.     j = f->st.st_fillp;
  151.  
  152.     filename[0] = '=';
  153.     for (i = 0; i < j; i++)
  154.         filename[i+1] = c[i];
  155.     filename[i+1] = '\0';
  156.  
  157.     if (p->pn.pn_directory == Cnil)
  158.         if (!dir_where_file(filen, dirn))
  159.             sys_emes(ERFDE);
  160.         else
  161.             ;
  162.     else {
  163.         d = make_pathname(Cnil, Cnil,
  164.                   p->pn.pn_directory,
  165.                   Cnil, Cnil, Cnil);
  166.         vs_push(d);
  167.         d = coerce_to_namestring(d);
  168.         c = d->st.st_self;
  169.         j = d->st.st_fillp;
  170.         for (i = 0; i < j; i++)
  171.             dirn[i] = c[i];
  172.         if (i > 0 && dirn[i-1] == ':') i--;
  173.         dirn[i] = '\0';
  174.     }
  175.     ac0 = dirn;
  176.     if (ier = sys($DIR, &ac0, &ac1, &ac2))
  177.         sys_emes(ier);
  178.     for (i = 0; (buname[i] = filename[i+1]) != '\0'; i++)
  179.         ;
  180.     buname[i++] = '.';
  181.     buname[i++] = 'B';
  182.     buname[i++] = 'U';
  183.     buname[i] = '\0';
  184.  
  185.     ac0 = buname;
  186.     if ((ier = sys($DELETE, &ac0, &ac1, &ac2)) != NULL &&
  187.         ier != ERFDE)
  188.             sys_emes(ier);
  189.     rename_file(filename, buname);
  190.  
  191.     fd = fopen(filename, open_opt);
  192.  
  193.     ac0 = 0;
  194.     if (ier = sys($DIR, &ac0, &ac1, &ac2))
  195.         sys_emes(ier);
  196.  
  197.     vs_reset;
  198.     return(fd);
  199. }
  200.  
  201. get_file_status(filen, filep)
  202. char *filen;
  203. P_FSTAT *filep;
  204. {
  205.     int ac0, ac1, ac2, ier;
  206.  
  207.     ac0 = filen;
  208.     ac1 = 0;
  209.     ac2 = filep;
  210.     if (ier = sys($FSTAT, &ac0, &ac1, &ac2))
  211.         sys_emes(ier);
  212. }
  213.  
  214. get_file_status_chan(fd, filep)
  215. FILE *fd;
  216. P_FSTAT *filep;
  217. {
  218.     int ac0, ac1, ac2, ier;
  219.  
  220.     ac0 = fchannel(fd);
  221.     ac1 = 020000000000;    /* channel in ac0 */
  222.     ac2 = filep;
  223.     if (ier = sys($FSTAT, &ac0, &ac1, &ac2))
  224.         sys_emes(ier);
  225. }
  226.  
  227. object
  228. file_write_date(filen)
  229. char *filen;
  230. {
  231.     union    fstat filep;
  232.     unsigned char ftype;
  233.     short    dd, tt;
  234.     object    time, time_zone, time_gap;
  235.  
  236.     get_file_status(filen, &filep);
  237.     ftype = filep.other.styp_type;
  238.     switch(ftype) {
  239.     case $FIPC:
  240.             dd = filep.ipc.stch.short_time[_DATE];
  241.             tt = filep.ipc.stch.short_time[_TIME];
  242.             break;
  243.     case $FLDU:
  244.     case $FDIR:
  245.     case $FCPD:
  246.             dd = filep.dir.stmh.short_time[_DATE];
  247.             tt = filep.dir.stmh.short_time[_TIME];
  248.             break;
  249.     case $FDKU:
  250.     case $FMCU:
  251.     case $FMTU:
  252.     case $FLPU:
  253.     case $FLPD:
  254.             dd = filep.unit.stch.short_time[_DATE];
  255.             tt = filep.unit.stch.short_time[_TIME];
  256.             break;
  257.     default:
  258.             dd = filep.other.stmh.short_time[_DATE];
  259.             tt = filep.other.stmh.short_time[_TIME];
  260.             break;
  261.     }
  262.     time = make_fixnum((dd - 1) * 24 * 3600 + tt * 2);
  263.                     /* tt is bi-seconds */
  264.     vs_push(time);
  265.     time_gap = make_fixnum(2145830400);
  266.     vs_push(time_gap);
  267.     time = number_plus(time, time_gap);
  268.     vs_pop;
  269.     vs_pop;
  270.     vs_push(time);
  271.     time_zone = make_fixnum(TIME_ZONE * 3600);
  272.     vs_push(time_zone);
  273.     time = number_plus(time, time_zone);
  274.     vs_pop;
  275.     vs_pop;
  276.  
  277.     return(time);
  278. }
  279.  
  280. int
  281. file_len(fd)
  282. FILE *fd;
  283. {
  284.     union fstat filep;
  285.     unsigned char ftype;
  286.  
  287.     get_file_status_chan(fd, &filep);
  288.     ftype = filep.other.styp_type;
  289.     switch(ftype) {
  290.     case $FIPC:
  291.     case $FDKU:
  292.     case $FMCU:
  293.     case $FMTU:
  294.     case $FLPU:
  295.     case $FLPD:
  296.             return(-1);
  297.     case $FLDU:
  298.     case $FDIR:
  299.     case $FCPD:
  300.             return(filep.dir.sefm);
  301.     default:
  302.             return(filep.other.sefm);
  303.     }
  304.  
  305. }
  306.  
  307. file_author(filen, author)
  308. char *filen, *author;
  309. {
  310.     char    aclbuf[256];
  311.     char    *up, *ap, *bp;
  312.         int    ac0, ac1, ac2, ier;
  313.     int    i;
  314.  
  315.     for (i = 0; i < 256; i++) aclbuf[i] = '\0';
  316.     ac0 = filen;
  317.     ac1 = aclbuf;
  318.     if (ier = sys($GACL, &ac0, &ac1, &ac2))
  319.         sys_emes(ier);
  320.     bp = author;
  321.     for (up = aclbuf; ;up = ap + 1) {
  322.         for (ap = up; *ap != '\0'; ap++)
  323.             ;
  324.         if (up == ap) break;
  325.         ap++;
  326.         if (*ap & $FACO) {
  327.             if (bp != author) *bp++ = ',';
  328.             for (i = 0; up[i] != '\0'; i++)
  329.                 *bp++ = up[i];
  330.         }
  331.     }
  332.     if (bp == author)
  333.         return(FALSE);
  334.     else {
  335.         *bp = '\0';
  336.         return(TRUE);
  337.     }
  338. }
  339.  
  340. username(uname)
  341. char *uname;
  342. {
  343.     int    ac0, ac1, ac2, ier;
  344.  
  345.     ac0 = -1;
  346.     ac1 = 1;
  347.     ac2 = uname;
  348.     if (ier = sys($GUNM, &ac0, &ac1, &ac2))
  349.         sys_emes(ier);
  350. }
  351.  
  352. object
  353. truename(file)
  354. object file;
  355. {
  356.     object x;
  357.     char filen[MAXNAME], pathn[MAXNAME];
  358.     int i, j;
  359.     char *c;
  360.  
  361.     x = coerce_to_namestring(file);
  362.     vs_push(x);
  363.     for (i = 0, j = x->st.st_fillp, c = x->st.st_self; i < j; i++)
  364.         filen[i] = c[i];
  365.     if (i > 1 && filen[i - 1] == ':') i--;
  366.     filen[i] = '\0';
  367.     if (!probe_file(filen, pathn, MAXNAME))
  368.         sys_emes(ERFDE);
  369.     x = make_simple_string(pathn);
  370.     vs_pop;
  371.     vs_push(x);
  372.     x = coerce_to_pathname(x);
  373.     vs_pop;
  374.     return(x);
  375. }
  376.  
  377. int
  378. file_exists(file)
  379. object file;
  380. {
  381.     char filen[MAXNAME], pathn[MAXNAME];
  382.     int i, j;
  383.     char *c;
  384.  
  385.     if (type_of(file) != t_string)
  386.         FEwrong_type_argument(Sstring, file);
  387.  
  388.     for (i = 0, j = file->st.st_fillp, c = file->st.st_self;
  389.          i < j; i++)
  390.         filen[i] = c[i];
  391.     if (i > 1 && filen[i-1] == ':') i--;
  392.     filen[i] = '\0';
  393.     return(probe_file(filen, pathn, MAXNAME));
  394. }
  395.  
  396. Ltruename()
  397. {
  398.     check_arg(1);
  399.     check_type_or_pathname_string_symbol_stream(&vs_base[0]);
  400.     vs_base[0] = truename(vs_base[0]);
  401. }
  402.  
  403. Luser_homedir_pathname()
  404. {
  405.     int    i, args;
  406.     object    x;
  407.     char    usern[MAXNAME], dirn[MAXNAME];
  408.  
  409.     args = vs_top - vs_base;
  410.     if (args > 1) too_many_arguments();
  411.     if (args == 1) {
  412.         check_type_or_pathname_string_symbol_stream(&vs_base[0]);
  413.         if (vs_base[0] != Cnil) {
  414.             vs_base[0] = Cnil;
  415.             return;
  416.         }
  417.     }
  418.     username(usern);
  419.     dirn[0] = dirn[4] = ':';
  420.     dirn[1] = 'U';
  421.     dirn[2] = dirn[3] = 'D';
  422.     for (i = 0; (dirn[i+5] = usern[i]) != '\0';i++)
  423.         ;
  424.     i += 5;
  425.     dirn[i++] = ':';
  426.     dirn[i] = '\0';
  427.     x = make_simple_string(dirn);
  428.     vs_push(x);
  429.     x = coerce_to_pathname(x);
  430.     vs_top = vs_base;
  431.     vs_push(x);
  432. }
  433.  
  434. Lrename_file()
  435. {
  436.     object    old, new, new1, truename_old, truename_new;
  437.     int    i, j;
  438.     char    *c;
  439.     char    oldn[MAXNAME], newn[MAXNAME];
  440.  
  441.     check_arg(2);
  442.     check_type_or_pathname_string_symbol_stream(&vs_base[0]);
  443.     check_type_or_pathname_string_symbol_stream(&vs_base[1]);
  444.  
  445.     new1 = vs_base[1];
  446.     if (type_of(new1) == t_stream)
  447.         FEerror("A filename is expected.", 0);
  448.     new1 = coerce_to_pathname(new1);
  449.     if (new1->pn.pn_host != Cnil ||
  450.         new1->pn.pn_device != Cnil ||
  451.         new1->pn.pn_directory != Cnil)
  452.         FEerror("A filename is expected.", 0);
  453.     vs_push(new1);
  454.  
  455.     new = namestring(new1);
  456.     j = new->st.st_fillp;
  457.     c = new->st.st_self;
  458.     for (i = 0; i < j; i++)
  459.         newn[i] = c[i];
  460.     newn[i] = '\0';
  461.  
  462.     truename_old = truename(vs_base[0]);
  463.     vs_push(truename_old);
  464.     truename_old = coerce_to_pathname(truename_old);
  465.     vs_pop;
  466.     vs_push(truename_old);
  467.  
  468.     old = coerce_to_namestring(vs_base[0]);
  469.     j = old->st.st_fillp;
  470.     c = old->st.st_self;
  471.     for (i = 0; i < j; i++)
  472.         oldn[i] = c[i];
  473.     oldn[i] = '\0';
  474.  
  475.     rename_file(oldn, newn);
  476.  
  477.     old = coerce_to_pathname(vs_base[0]);
  478.     vs_push(old);
  479.     new = make_pathname(
  480.         old->pn.pn_host,
  481.         old->pn.pn_device,
  482.         old->pn.pn_directory,
  483.         new1->pn.pn_name,
  484.         new1->pn.pn_type,
  485.         old->pn.pn_version);
  486.     vs_push(new);
  487.     truename_new = truename(new);
  488.  
  489.     vs_top = vs_base;
  490.     vs_push(new);
  491.     vs_push(truename_old);
  492.     vs_push(truename_new);
  493. }
  494.  
  495. Ldelete_file()
  496. {
  497.     int    i, j;
  498.     char    *c;
  499.     char    pathn[MAXNAME];
  500.     char    truen[MAXNAME];
  501.  
  502.     check_arg(1);
  503.     check_type_or_pathname_string_symbol_stream(&vs_base[0]);
  504.     vs_base[0] = coerce_to_namestring(vs_base[0]);
  505.     j = vs_base[0]->st.st_fillp;
  506.     c = vs_base[0]->st.st_self;
  507.     for (i = 0; i < j; i++)
  508.         pathn[i] = c[i];
  509.     if (i > 1 && pathn[i-1] == ':') i--;
  510.     pathn[i] = '\0';
  511.     probe_file(pathn, truen, MAXNAME);
  512.     delete_file(truen);
  513.     vs_base[0] = Ct;
  514. }
  515.  
  516. Lprobe_file()
  517. {
  518.     int    i, j, dirflg;
  519.     char    *c;
  520.     char    filen[MAXNAME], pathname[MAXNAME];
  521.  
  522.     check_arg(1);
  523.     check_type_or_pathname_string_symbol_stream(&vs_base[0]);
  524.     vs_base[0] = coerce_to_namestring(vs_base[0]);
  525.     c = vs_base[0]->st.st_self;
  526.     j = vs_base[0]->st.st_fillp;
  527.     for (i = 0; i < j; i++)
  528.         filen[i] = c[i];
  529.     if (i > 1 && filen[i-1] == ':') {
  530.         i--;
  531.         dirflg = TRUE;
  532.     } else
  533.         dirflg = FALSE;
  534.     filen[i] = '\0';
  535.     if (!probe_file(filen, pathname, MAXNAME)) {
  536.         vs_base[0] = Cnil;
  537.         return;
  538.     }
  539.     if (dirflg) {
  540.         for (i = 0; pathname[i] != '\0'; i++)
  541.             ;
  542.         pathname[i++] = ':';
  543.         pathname[i] = '\0';
  544.     }
  545.     vs_base[0] = make_simple_string(pathname);
  546.     vs_base[0] = coerce_to_pathname(vs_base[0]);
  547. }
  548.  
  549. Lfile_write_date()
  550. {
  551.     int    i, j;
  552.     char    *c;
  553.     char    filen[MAXNAME];
  554.  
  555.     check_arg(1);
  556.     check_type_or_pathname_string_symbol_stream(&vs_base[0]);
  557.     vs_base[0] = coerce_to_namestring(vs_base[0]);
  558.     c = vs_base[0]->st.st_self;
  559.     j = vs_base[0]->st.st_fillp;
  560.     for (i = 0; i < j; i++)
  561.         filen[i] = c[i];
  562.     if (i > 1 && filen[i-1] == ':') i--;
  563.     filen[i] = '\0';
  564.     vs_base[0] = file_write_date(filen);
  565. }
  566.  
  567. Lfile_author()
  568. {
  569.     int    i, j;
  570.     char    *c;
  571.     char    filen[MAXNAME];
  572.     char    author[MAXNAME];
  573.  
  574.     check_arg(1);
  575.     check_type_or_pathname_string_symbol_stream(&vs_base[0]);
  576.     vs_base[0] = coerce_to_namestring(vs_base[0]);
  577.     c = vs_base[0]->st.st_self;
  578.     j = vs_base[0]->st.st_fillp;
  579.     for (i = 0; i < j; i++)
  580.         filen[i] = c[i];
  581.     if (i > 1 && filen[i-1] == ':') i--;
  582.     filen[i] = '\0';
  583.     if (file_author(filen, author))
  584.         vs_base[0] = make_simple_string(author);
  585.     else
  586.         vs_base[0] = Cnil;
  587.  
  588. }
  589.  
  590. Ldirectory()
  591. {
  592.     int    ac0, ac1, ac2, ier;
  593.     int    i, j;
  594.     char    dirn[MAXNAME], template[MAXNAME];
  595.     char    filen[MAXNAME], temp[MAXNAME];
  596.     char    *c;
  597.     FILE    *fd;
  598.     P_GNFN    gnfnp;
  599.     object    d, s;
  600.  
  601.     check_arg(1);
  602.     check_type_or_pathname_string_symbol_stream(&vs_base[0]);
  603.  
  604.     gnfnp.nfky = 0;
  605.     gnfnp.nfrs = 0;
  606.     gnfnp.nfnm = filen;
  607.     gnfnp.nftp = -1;
  608.  
  609.     vs_base[0] = coerce_to_pathname(vs_base[0]);
  610.     if (vs_base[0]->pn.pn_directory == Cnil) {
  611.         temp[0] = '=';
  612.         temp[1] = '\0';
  613.         probe_file(temp, dirn, MAXNAME);
  614.     } else {
  615.         d =
  616.         make_pathname(Cnil, Cnil,
  617.                   vs_base[0]->pn.pn_directory,
  618.                   Cnil, Cnil, Cnil);
  619.         vs_push(d);
  620.         s = coerce_to_namestring(d);
  621.         vs_pop;
  622.         j = s->st.st_fillp;
  623.         c = s->st.st_self;
  624.         for (i = 0; i < j; i++)
  625.             temp[i] = c[i];
  626.         if (i > 1 && temp[i-1] == ':')
  627.             i--;
  628.         temp[i] = '\0';
  629.         if (!probe_file(temp, dirn, MAXNAME)) {
  630.             vs_top = vs_base;
  631.             vs_push(Cnil);
  632.             return;
  633.         }
  634.     }
  635.  
  636.     if (vs_base[0]->pn.pn_name == Cnil &&
  637.         vs_base[0]->pn.pn_type == Cnil)
  638.         gnfnp.nftp = -1;
  639.     else {
  640.         s = make_pathname(Cnil, Cnil, Cnil,
  641.                   vs_base[0]->pn.pn_name,
  642.                   vs_base[0]->pn.pn_type,
  643.                   vs_base[0]->pn.pn_version);
  644.         vs_push(s);
  645.         s = namestring(s);
  646.         vs_pop;
  647.         gnfnp.nftp = template;
  648.         j = s->st.st_fillp;
  649.         c = s->st.st_self;
  650.         for (i = 0; i < j; i++)
  651.             template[i] = c[i];
  652.         template[i] = '\0';
  653.     }
  654.  
  655.     if ((fd = fopen(dirn, "r")) == NULL) {
  656.         if ((ier = lasterror()) == ERFDE) {
  657.             vs_top = vs_base;
  658.             vs_push(Cnil);
  659.             return;
  660.         }
  661.         sys_emes(ier);
  662.     }
  663.     for (i = 0; (temp[i] = dirn[i]) != '\0'; i++)
  664.         ;
  665.     if (i > 1) temp[i++] = ':';    /* not root directory ? */
  666.     j = i;
  667.     ac0 = 0;
  668.     ac1 = fchannel(fd);
  669.     ac2 = &gnfnp;
  670.     vs_top = vs_base;
  671.     vs_push(Cnil);
  672.     vs_push(Cnil);
  673.     while ((ier = sys($GNFN, &ac0, &ac1, &ac2)) == NULL) {
  674.         for (i = 0; (temp[j+i] = filen[i]) != '\0'; i++)
  675.             ;
  676.         probe_file(temp, filen, MAXNAME);
  677.         vs_base[1] = make_simple_string(filen);
  678.         vs_base[1] = coerce_to_pathname(vs_base[1]);
  679.         vs_base[0] = make_cons(vs_base[1], vs_base[0]);
  680.     }
  681.     fclose(fd);
  682.     if (ier == EREOF) {
  683.         vs_top = vs_base + 1;
  684.         return;
  685.     } else
  686.         sys_emes(ier);
  687. }
  688.  
  689. init_filesystem()
  690. {
  691.     make_function("TRUENAME", Ltruename);
  692.     make_function("USER-HOMEDIR-PATHNAME", Luser_homedir_pathname);
  693.     make_function("RENAME-FILE", Lrename_file);
  694.     make_function("DELETE-FILE", Ldelete_file);
  695.     make_function("PROBE-FILE", Lprobe_file);
  696.     make_function("FILE-WRITE-DATE", Lfile_write_date);
  697.     make_function("FILE-AUTHOR", Lfile_author);
  698.     make_function("DIRECTORY", Ldirectory);
  699. }
  700.